# 1.透视表
import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('超市营业额2.xlsx')
print('查看每人每天交易总额'.ljust(20, '='))
dff = df.groupby(by=['姓名', '日期'], as_index=False).sum(numeric_only=True)
# 数据量太大，为减少篇幅占用，只输出前5天的数据
dff = dff.pivot(index='姓名', columns='日期', values='交易额')

print(dff.iloc[:, :5])

print('交易总额低于5万元的员工前5天业绩'.ljust(20, '='))
print((dff[dff.sum(axis=1) < 50000]).iloc[:, :5])
print('交易总额低于5万元的员工姓名'.ljust(20, '='))
print((dff[dff.sum(axis=1) < 50000]).index.values)

print('使用pivot_table()方法实现'.ljust(20, '='))
# 如果把只显示前5列的限制去掉，会发现最后还有一个名字为ALL的列
print(df.pivot_table(values='交易额', index='姓名', columns='日期', aggfunc='sum', margins=True).iloc[:, :5])
print('查看每人在各柜台的交易总额'.ljust(20, '='))
dff = df.groupby(by=['姓名', '柜台'], as_index=False).sum(numeric_only=True)
print(dff.pivot(index='姓名', columns='柜台', values='交易额'))
print('查看每人每天的上班次数'.ljust(20, '='))
print(df.pivot_table(values='交易额', index='姓名', columns='日期', aggfunc='count', margins=True).iloc[:, 5])
print('查看每人在各柜台的上班次数'.ljust(20, '='))
print(df.pivot_table(values='交易额', index='姓名', columns='柜台', aggfunc='count', margins=True))


# 2.交叉表
df = pd.read_excel('超市营业额2.xlsx')

print('每人每天的上班次数：')
print(pd.crosstab(df['姓名'], df['日期'], margins=True).iloc[:, :-1])

print('\n每人在各柜台的交易次数：')
print(df.groupby(['姓名', '柜台']).size())

print('\n每人各柜台总金额：')
print(df.groupby(['姓名', '柜台'])[['交易额']].sum().reset_index().pivot_table(index='姓名', columns='柜台', values='交易额', aggfunc='sum'))

print('\n每人各柜台交易额平均值：')
print(df.pivot_table(index='姓名', columns='柜台', values='交易额', aggfunc='mean').apply(lambda num: round(num, 2)))
